package com.bitoon.basketdudes.web;

import com.bitoon.basketdudes.web.jpa.*;
import com.bitoon.basketdudes.web.commons.RankingCommon;
import com.bitoon.basketdudes.web.datos.*;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.util.ValueStack;
import java.util.*;
import javax.persistence.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.apache.struts2.interceptor.ServletResponseAware;

public class Index extends BaseListadoResultados implements ServletResponseAware {

    private List<DatosRanking> rankingGlobal;
    private List<DatosRanking> rankingPais;
    private List<DatosCalendario> calendario;
    private List<Partido> partidosPasados;
    //private int diasCalendario;

    //private int POSICIONES_FILA = 10; // Posiciones en el ranking que se muestran en pantalla

    private Logger log = Logger.getLogger(Index.class);

    // For access to the raw servlet request / response, eg for cookies
    protected HttpServletResponse servletResponse;
    @Override
    public void setServletResponse(HttpServletResponse servletResponse) {
        this.servletResponse = servletResponse;
    }


    public String execute() {
        String retorno = SUCCESS;

        try {

            //retorno = checkLanding();
            //log.debug("[visperasantos] checkLanding devuelve: " + retorno);

            // Prueba de mandar email
            /*
            Mail mail = new Mail();
            String plantilla = ServletActionContext.getServletContext().getRealPath("/bd/base_mailing.html");
            mail.sendMailPlantilla(log,plantilla,"alberto.piquer@bitoon.com","nuevo asunto","Hola amijo");
             *
             */

            ValueStack valueStack = ActionContext.getContext().getValueStack();
            
            // Consultar ranking global
            RankingCommon rc = new RankingCommon();
            setRankingGlobal(rc.listadoRankingGlobal(0, LISTADO_RANKING_POSICIONES_FILA));
            setRankingPais(rc.listadoRankingPais("TW", 0, LISTADO_RANKING_POSICIONES_FILA));

            // Consultar el calendario
            //CalendarioCommon cc = new CalendarioCommon();
            //setCalendario(cc.calendarioPartido(3,0));
            //setDiasCalendario(getCalendario().size());

            if (valueStack.findValue("stackUserLogado") != null) {
                Usuario u = (Usuario)valueStack.findValue("stackUserLogado");
                //setListaEquiposMostrar(u.getEquipos());
                retorno = SUCCESS;
            }

            log.debug("El resultado final es ... " + retorno);
            
        } catch (Exception e) {
            log.error("Error en Index", e);
            retorno = ERROR;
        }

        return retorno;

    }

    /*
    private String checkLanding() {
        String retorno = SUCCESS;

        //log.debug("[visperasantos] check landing ...");
        //log.debug("[visperasantos] bd_mostrarlanding: " + session.get("bd_mostrarlanding"));

        if (session != null &&
                (session.get("bd_mostrarlanding") == null ||
                 (session.get("bd_mostrarlanding")!=null && (Boolean)session.get("bd_mostrarlanding")))) {

            //log.debug("[visperasantos] devolver landing, hay que mostrar la landing");
            retorno = LANDING;

            //log.debug("[visperasantos] bd_mostrarlanding a false");
            session.put("bd_mostrarlanding", false);

            // Comprobar la cookie
            //log.debug("[visperasantos] Grabar cookie");
            Cookie[] cookies = getServletRequest().getCookies();
            if (cookies != null) {
                for(Cookie c : cookies) {
                    log.debug("cookie: " + c.getName());
                    if (c.getName().equals("bdlndng")) {
                        // Existe la cookie, poner la sesion a false
                        log.debug("pongo a false mostrarlanding ...");
                        session.put("bd_mostrarlanding", false);
                        retorno = SUCCESS;
                    }
                }
            }

        }
        
        return retorno;
    }
     * 
     */
    
    public ManagerSemana getManager() {
        ManagerSemana m = leerManagerXML();

        return m;
    }

    public List<MejorEquipo> getMejoresEquipos() {
        return leerMejoresEquiposXML();
    }

    public Equipo getMiMejorAtaque() {
        EntityManager em = null;
        Equipo retorno = null;

        try {
            if (getUsuarioLogado()!=null) {
                em = emfBasket.createEntityManager(); // checked
                Query q = em.createNamedQuery("Equipo.findMejorAtaqueByIdUsuario");
                q.setParameter("idUsuario", getUsuarioLogado().getId());
                q.setMaxResults(1); // Sólo el primero
                retorno = (Equipo)q.getSingleResult();
            }
        } catch (NoResultException nre) {
            log.debug("[getMiMejorAtaque] No se encuentra el mejor ataque");
        } catch (Exception e) {

        } finally {
            try { em.close(); } catch (Exception e) { }
        }

        return retorno;
    }

    public Equipo getMiMejorDefensa() {
        EntityManager em = null;
        Equipo retorno = null;

        try {
            if (getUsuarioLogado()!=null) {
                em = emfBasket.createEntityManager(); // checked
                Query q = em.createNamedQuery("Equipo.findMejorDefensaByIdUsuario");
                q.setParameter("idUsuario", getUsuarioLogado().getId());
                q.setMaxResults(1); // Sólo el primero
                retorno = (Equipo)q.getSingleResult();
            }
        } catch (NoResultException nre) {
            log.debug("[getMiMejorDefensa] No se encuentra la mejor defensa");
        } catch (Exception e) {
            log.error("[getMiMejorDefensa] ", e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }

        return retorno;
    }

    /* Mejores ataque y defensa */

    public Equipo getMejorAtaque() {
        EntityManager em = null;
        Equipo retorno = null;

        try {
            em = emfBasket.createEntityManager(); // checked
            Query q = em.createNamedQuery("Equipo.findMejorAtaque");
            q.setMaxResults(1); // Sólo el primero
            retorno = (Equipo)q.getSingleResult();
        } catch (NoResultException nre) {
            log.debug("[getMejorAtaque] No se encuentra el mejor ataque");
        } catch (Exception e) {
            log.error("[getMejorAtaque] ", e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }

        return retorno;
    }

    public Equipo getMejorDefensa() {
        EntityManager em = null;
        Equipo retorno = null;

        try {
            em = emfBasket.createEntityManager(); // checked
            Query q = em.createNamedQuery("Equipo.findMejorDefensa");
            q.setMaxResults(1); // Sólo el primero
            retorno = (Equipo)q.getSingleResult();
        } catch (NoResultException nre) {
            log.debug("[getMejorDefensa] No se encuentra el mejor ataque");
        } catch (Exception e) {
            log.error("[getMejorDefensa] ", e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }

        return retorno;
    }


    public List<JugadorQuintetoSemana> getQuintetoSemana() {
        return leerQuintetoXML();
    }

    public List<Equipo> getEquiposUsuario() {
        EntityManager em = null;
        List<Equipo> lista = null;

        try {

            ValueStack valueStack = ActionContext.getContext().getValueStack();
            Usuario u = (Usuario)valueStack.findValue("stackUserLogado");

            em = emfBasket.createEntityManager(); // checked
            Query q = em.createNamedQuery("Equipo.findByIdUsuario");
            q.setParameter("idUsuario", u.getId());

            lista = (List<Equipo>)q.getResultList();

        } catch (Exception e) {
            log.error("[getEquiposUsuario]: " + e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }

        return lista;
    }

    public List<DatosRanking> getRankingGlobal() {
        return rankingGlobal;
    }

    public void setRankingGlobal(List<DatosRanking> rankingGlobal) {
        this.rankingGlobal = rankingGlobal;
    }

    public List<DatosRanking> getRankingPais() {
        return rankingPais;
    }

    public void setRankingPais(List<DatosRanking> rankingPais) {
        this.rankingPais = rankingPais;
    }

    public List<DatosCalendario> getCalendario() {
        return calendario;
    }

    public void setCalendario(List<DatosCalendario> calendario) {
        this.calendario = calendario;
    }

    public List<Partido> getPartidosPasados() {
        //setPartidosPasados(lista);
        return getPartidosPasadosLimit(10);
    }



    public void setPartidosPasados(List<Partido> partidosPasados) {
        this.setPartidosPasados(partidosPasados);
    }

    /*
    public int getDiasCalendario() {
        return diasCalendario;
    }

    public void setDiasCalendario(int diasCalendario) {
        this.diasCalendario = diasCalendario;
    }
     * 
     */

}
